最近談了這麼多的 ECS 來換換口味來個 Amazon Elastic Kubernetes Service 吧!通常我們簡稱它為 Amazon EKS 或是 AWS EKS 後面我們會直接使用 AWS EKS 稱呼它
在一開始我們先來簡單介紹一下 AWS EKS 這個服務,它在 2017/11/29 發布預覽版,還記得那個時候剛發布就去申請了 preview,初期版本滿簡單的而且不能外掛任何的模組
經過了半年多在 2018/06/05 發布了正式版
在一年後 2019/06/03 開始支援 AWS Fargate
在 2020/03/10 也開始更新到 1.15 版
而在 2020/04/30 更新到 Kubernetes 1.16 版
在 2020/01/21 之前的價格是每小時 0.20 USD 發布訊息後由原本的 0.20 USD 降至每小時 0.10 USD 價格降低了 50%,其實這個價格說貴不貴說便宜也不便宜因為自己起一台 AWS c5.large 也需要 0.10 USD 而且還需要自己顧這台 EC2
簡單介紹了 AWS EKS 的歷史那我們就來使用 AWS CDK 建立 AWS EKS 吧!
在說明之前我們先來看一下我們今天要完成的目標架構圖,今天要完成的地方是紅色框框裡面的部分,有 Amazon EKS 本身跟 Kubernetes Cluster 讓它跑在 EC2 上面
出處 AWS re:Invent 2019: [REPEAT 1] Amazon EKS under the hood (CON421-R1)
PPT
YouTube
其實要使用 CDK 建立一個 EKS 非常的簡單只要一行就可以把整個非常龐大的 K8S 啟動
const cluster = new eks.Cluster(this, "eks", {
version: eks.KubernetesVersion.V1_17,
});
如此配置會在後面創建一個新的 VPC 與兩台 m5.large 的機器
https://docs.aws.amazon.com/cdk/api/latest/docs/aws-eks-readme.html#managed-node-groups
https://docs.aws.amazon.com/cdk/api/latest/docs/aws-eks-readme.html#masters-role
如此配置 EKS 沒有辦法訪問,所以我們建立一個 Role 它會把 IAM 與 system:masters 進行一個綁定,來修改一下程式
const mastersRole = new iam.Role(this, "mastersRole", {
assumedBy: new iam.AccountRootPrincipal(),
});
const cluster = new eks.Cluster(this, "eks", {
version: eks.KubernetesVersion.V1_17,
mastersRole,
});
我在測試比較喜歡用 spot 的機器畢竟 spot 的機器比較便宜,所以我在這邊先做一些修改加入 spot 的設定,如果之前有看我的 ECS 介紹就會覺得這邊很熟悉我們只要跟 auto scaling group 說明 spot 的 price 就會幫我們啟動一個 spot 的 cluster 了!
這邊要注意原本的 cluster 也會啟動機器所以要把 defaultCapacity
設定為 0 不然會跑出三台呦!
const cluster = new eks.Cluster(this, "eks", {
version: eks.KubernetesVersion.V1_17,
defaultCapacity: 0,
mastersRole,
});
cluster.addAutoScalingGroupCapacity("spot", {
spotPrice: "0.1094",
instanceType: new ec2.InstanceType("t3.large"),
});
而因為整個架構比較複雜這邊的部署要先有心理準備,大概需要 15 分鐘到 30 分鐘的時間
部署完成後 CDK 很貼心的準備好要怎麼登入 EKS 的指令直接服用就可以了!
Outputs:
CdkEksStack.eksConfigCommandDB09280A = aws eks update-kubeconfig --name eksB49B8EA3-7fcd6a64ed934f00ae43ec1cb67a87fa --region us-west-2 --role-arn arn:aws:iam::888888888888:role/CdkEksStack-mastersRole634808EE-1I504Q4EPLS70
CdkEksStack.eksGetTokenCommand8952195F = aws eks get-token --cluster-name eksB49B8EA3-7fcd6a64ed934f00ae43ec1cb67a87fa --region us-west-2 --role-arn arn:aws:iam::888888888888:role/CdkEksStack-mastersRole634808EE-1I504Q4EPLS70
$ aws eks update-kubeconfig --name eksB49B8EA3-7fcd6a64ed934f00ae43ec1cb67a87fa --region us-west-2 --role-arn arn:aws:iam::888888888888:role/CdkEksStack-mastersRole634808EE-1I504Q4EPLS70
Added new context arn:aws:eks:us-west-2:888888888888:cluster/eksB49B8EA3-7fcd6a64ed934f00ae43ec1cb67a87fa to /Users/clarence/.kube/config
如此執行完我們就可以使用 kubectl 指令拉!執行 get node 可以看到我們有一台機器受 EKS 管理
$ kubectl get node
NAME STATUS ROLES AGE VERSION
ip-10-0-255-11.us-west-2.compute.internal Ready <none> 14m v1.17.11-eks-cfdc40
我們先到 AWS Console 看看 Clusters 出現了我剛剛創建的 EKS Cluster
也可以在 EC2 看到唯一的一台 EC2 機器
Details
Compute
Networking
Logging
Update history
Tags
今天介紹 EKS 叢集如果熟悉 K8S 的朋友其實只需要如此就可以開始用一般的方法使用拉!
文章內容主要是網路或是程式開發類型的文章
本文同步刊載於 Clarence 部落格:Day 25 - CDK 建置 Amazon Elastic Kubernetes Service(EKS)- Cluster
「AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC」
本書改編並延伸自第 12 屆 iT 邦幫忙鐵人賽獲得 DevOps 組冠軍的《用 CDK 定義 AWS 架構》系列文章,以簡單、好讀的行文風格詳述技術細節,並提供完整的程式碼範例與說明,一步一步帶領新手從零開始踏上 AWS CDK 技術達人之路。有興趣的朋友歡迎至天瓏書局選購!